/**
 * @Copyright:Copyright (c) 2007 - 2023
 * 
 */
package com.tengtong.commons.json;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

import com.tengtong.commons.base.KeyValue;
import com.tengtong.commons.lang.StringUtils;

/**
 * Json 接口
 *
 * @author lin_jinming
 * @since: v1.0
 */
public interface Json extends Iterable<KeyValue>{
    
    /**
     * 设置数据
     *
     * @param name
     * @param value
     * @return
     */
    public Json putData(String name, Object value);
    
    /**
     * 如果包含 name ，就返回 true，否则返回 false
     *
     * @param name
     * @return
     */
    public boolean contains(String name);
    
    /**
     * 使用名称获取对象
     *
     * @param name
     * @return
     */
    public Object getObject(String name);
    
    /**
     * 名称获取对象，如果不存在就返回 defaultValue 的值
     *
     * @param name
     * @param defaultValue
     * @return
     */
    public Object getObject(String name, Object defaultValue);
    
    /**
     * 返回一个 Map
     *
     * @return
     */
    public Map<String, Object> toMap();
    
    /**
     * 键值
     *
     * @return
     */
    public Set<String> getKeySet();
    
    /**
     * 值集
     *
     * @return
     */
    public Collection<Object> getValues();
    
    /**
     * 返回字符串
     *
     * @param name
     * @return
     */
    default public String getString(String name) {
        Object o = getObject(name, null);
        return StringUtils.asString(o);
    }
    
    /**
     * 如果 name 存在则返回值，如果不存在则返回 defaultValue
     *
     * @param name
     * @param defaultValue
     * @return
     */
    default public String getString(String name, String defaultValue) {
        if(contains(name)) {
            return getString(name);
        }
        return defaultValue;
    }
    
    /**
     * 返回布尔值
     *
     * @param name
     * @return
     */
    default public boolean getBoolean(String name) {
        Object o = getObject(name);
        return Boolean.valueOf(StringUtils.asString(o));
    }
    
    default public boolean getBoolean(String name, boolean defaultValue) {
        if(contains(name)) {
            try {
                return getBoolean(name);
            }catch (Exception e) {
            }
        }
        return defaultValue;
    }
    
    /**
     * 返回 int 值
     *
     * @param name
     * @return
     */
    default public int getInt(String name) {
        Object o = getObject(name);
        if(o != null) {
            if(o instanceof Integer i) {
                return i.intValue();
            }
            
            return Integer.valueOf(o.toString());
        }
        return 0;
    }
    
    /**
     * 如果 name 存在，则返回 int 值，不存在就返回 defaultValue
     *
     * @param name
     * @param defaultValue
     * @return
     */
    default public int getInt(String name, int defaultValue) {
        if(contains(name)) {
            return getInt(name);
        }
        return defaultValue;
    }
    
    default public Json each(BiConsumer<String, Object> consumer) {
        if(consumer != null){
            for(var kv: this) {
                consumer.accept(kv.getKey(), kv.getValue());
            }
        }
        return this;
    }
}
